package com.haoxuer.discover.data.utils;

import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * @author 陈联高
 * @version 1.01 2017年03月121日
 */
public final class RMB {
  private double amount = 0.0D;
  private static final String NUM = "零壹贰叁肆伍陆柒捌玖";
  private static final String UNIT = "仟佰拾个";
  private static final String GRADEUNIT = "仟万亿兆";
  private static final String DOTUNIT = "角分厘";
  private static final int GRADE = 4;
  private static final String SIGN = "￥";
  private static final NumberFormat nf = new DecimalFormat("#0.###");

  public RMB(double amount) {
    this.amount = amount;
  }

  public String toBigAmt() {
    return toBigAmt(this.amount);
  }

  public static String toBigAmt(double amount) {
    String amt = nf.format(amount);
    Double d = new Double(amount);
    String dotPart = ""; //取小数位
    String intPart = ""; //取整数位
    int dotPos;
    if ((dotPos = amt.indexOf('.')) != -1) {
      intPart = amt.substring(0, dotPos);
      dotPart = amt.substring(dotPos + 1);
    } else {
      intPart = amt;
    }
    if (intPart.length() > 16) {
      throw new InternalError("The amount is too big.");
    }
    String intBig = intToBig(intPart);
    String dotBig = dotToBig(dotPart);
    //以下代码稍做修改，现在是完美的代码啦！
    if ((dotBig.length() == 0) && (intBig.length() != 0)) {
      return intBig + "元整";
    } else if ((dotBig.length() == 0) && (intBig.length() == 0)) {
      return intBig + "零元";
    } else if ((dotBig.length() != 0) && (intBig.length() != 0)) {
      return intBig + "元" + dotBig;
    } else {
      return dotBig;
    }
/*
    if(dotBig.length() == 0) return intBig +"元整";
    else return intBig + "元" + dotBig;
*/
  }

  private static String dotToBig(String dotPart) {
    //得到转换后的大写（小数部分）
    String strRet = "";
    for (int i = 0; i < dotPart.length() && i < 3; i++) {
      int num;
      if ((num = Integer.parseInt(dotPart.substring(i, i + 1))) != 0) {
        strRet += NUM.substring(num, num + 1) + DOTUNIT.substring(i, i + 1);
      }
    }
    return strRet;
  }

  private static String intToBig(String intPart) {
    //得到转换后的大写（整数部分）
    int grade; //级长
    String result = "";
    String strTmp = "";
    //得到当级长
    grade = intPart.length() / GRADE;
    //调整级次长度
    if (intPart.length() % GRADE != 0) {
      grade += 1;
    }
    //对每级数字处理
    for (int i = grade; i >= 1; i--) {
      strTmp = getNowGradeVal(intPart, i);//取得当前级次数字
      result += getSubUnit(strTmp);//转换大写
      result = dropZero(result);//除零
      //加级次单位
      if (i > 1) //末位不加单位
      //单位不能相连续
      {
        if (getSubUnit(strTmp).equals("零零零零")) {
          result += "零" + GRADEUNIT.substring(i - 1, i);
        } else {
          result += GRADEUNIT.substring(i - 1, i);
        }
      }
    }
    return result;
  }

  private static String getNowGradeVal(String strVal, int grade) {
    //得到当前级次的串
    String rst;
    if (strVal.length() <= grade * GRADE) {
      rst = strVal.substring(0, strVal.length() - (grade - 1) * GRADE);
    } else {
      rst = strVal.substring(strVal.length() - grade * GRADE, strVal.length() - (grade - 1) * GRADE);
    }
    return rst;
  }

  private static String getSubUnit(String strVal) {
    //数值转换
    String rst = "";
    for (int i = 0; i < strVal.length(); i++) {
      String s = strVal.substring(i, i + 1);
      int num = Integer.parseInt(s);
      if (num == 0) {
        //“零”作特殊处理
        if (i != strVal.length()) //转换后数末位不能为零
        {
          rst += "零";
        }
      } else {
        //If IntKey = 1 And i = 2 Then
        //“壹拾”作特殊处理
        //“壹拾”合理
        //Else
        rst += NUM.substring(num, num + 1);
        //End If
        //追加单位
        if (i != strVal.length() - 1)//个位不加单位
        {
          rst += UNIT.substring(i + 4 - strVal.length(), i + 4 - strVal.length() + 1);
        }
      }
    }
    return rst;
  }

  private static String dropZero(String strVal) {
    //去除连继的“零”
    String strRst;
    String strBefore; //前一位置字符
    String strNow;    //现在位置字符
    strBefore = strVal.substring(0, 1);
    strRst = strBefore;
    for (int i = 1; i < strVal.length(); i++) {
      strNow = strVal.substring(i, i + 1);
      if (strNow.equals("零") && strBefore.equals("零")) {
        ;//同时为零
      } else {
        strRst += strNow;
      }
      strBefore = strNow;
    }
    //末位去零
    if (strRst.substring(strRst.length() - 1, strRst.length()).equals("零")) {
      strRst = strRst.substring(0, strRst.length() - 1);
    }
    return strRst;
  }

  public static void main(String[] args) {
    System.out.println(RMB.toBigAmt(10052345.00D));
    System.out.println(RMB.toBigAmt(0.00D));
    System.out.println(RMB.toBigAmt(0.60D));
    System.out.println(RMB.toBigAmt(00.60D));
    System.out.println(RMB.toBigAmt(150.2101D));
    System.out.println(RMB.toBigAmt(15400089666.234D));
    System.out.println(RMB.toBigAmt(22200004444.2347D));
  }
}